#include <stdio.h>

int main(int argc, const char *argv[])
{
	// 指针+整数n  表示加上n个操作空间的大小 并不一定表示加n个字节
	int x = 0;
	char *p1 = (char *)&x;
	printf("p1 = %p   p1+1 = %p\n", p1, p1+1); // 相差1
	int *p2 = &x;
	printf("p2 = %p   p2+1 = %p\n", p2, p2+1); // 相差4

	// 两个指针作差 表示 两个指针保存的地址间相差多少个操作空间的大小
	// 这种情况一般在连续的空间中才有意义
	int s[5] = {10, 20, 30, 40, 50};
	int *p3 = &s[0];
	int *p4 = &s[3];
	int ret1 = p4 - p3;
	printf("ret1 = %d\n", ret1); // 3  表示3个int
	
	short *p5 = (short *)&s[0];
	short *p6 = (short *)&s[3];
	int ret2 = p6 - p5;
	printf("ret2 = %d\n", ret2); // 6  表示6个short

	// 指针的关系运算  也是在连续的内存空间中有意义
	int *p7 = &s[0];
	int *p8 = &s[1];
	if(p7 > p8){ // 其他关系运算符 用法同理
		printf("yes\n");
	}else{
		printf("no\n"); // no
	}

	// 指针的赋值运算
	// 指针变量也是变量 可以被重新赋值  指针变量间也可以相互赋值
	int num1 = 1234;
	int num2 = 5678;
	int *p9 = &num1;
	p8 = p9; // 指针变量间的相互赋值
	printf("%d\n", *p8); // 1234
	
	// 指针也支持复合赋值运算符
	printf("p7 = %p  *p7 = %d\n", p7, *p7); // &s[0]  10
	p7 += 1;
	printf("p7 = %p  *p7 = %d\n", p7, *p7); // &s[1]  20

	printf("----------------------------------------\n");
	// 关于指针的自增自减运算 要注意下面的用法
	// int s[5] = {10, 20, 30, 40, 50};
	int *q1 = &s[0];
	printf("q1 = %p  *q1 = %d\n", q1, *q1); // &s[0] 10
	int *q2 = ++q1;
	printf("q1 = %p  *q1 = %d\n", q1, *q1); // &s[1] 20
	printf("q2 = %p  *q2 = %d\n", q2, *q2); // &s[1] 20

	printf("----------------------------------------\n");

	int *q3 = &s[0];
	printf("q3 = %p  *q3 = %d\n", q3, *q3); // &s[0] 10
	int *q4 = q3++;
	printf("q3 = %p  *q3 = %d\n", q3, *q3); // &s[1] 20
	printf("q4 = %p  *q4 = %d\n", q4, *q4); // &s[0] 10

	printf("----------------------------------------\n");
	
	// int s[5] = {10, 20, 30, 40, 50};
	int *q5 = &s[0];
	int v1 = *++q5; // 先算++q5 然后取*是对整个 ++q5 表达式的结果取*
	printf("q5 = %p  v1 = %d\n", q5, v1); // &s[1]  20 
	
	printf("----------------------------------------\n");
	
	int *q6 = &s[0];
	int v2 = *q6++; // 先算q6++ 然后取*是对整个 q6++ 表达式的结果取*
					// 给我们的感觉像是: 先取 *q6 然后 q6++
	printf("q6 = %p  v2 = %d\n", q6, v2); // &s[1]  10 

	printf("----------------------------------------\n");

	int *q7 = &s[0];
	int v3 = (*q7)++; // 等价于  s[0]++
	printf("q7 = %p  v3 = %d  s[0] = %d\n", q7, v3, s[0]); // &s[0] 10 11

	return 0;
}
